package cn.demoncat.util.lang.entity;

import java.io.Serializable;
import java.util.Objects;

import cn.demoncat.util.lang.JsonUtil;
import cn.demoncat.util.sec.RSAUtil;

/**
 * 远程请求参数(用于外网系统间HTTP调用，使用RSA+AES+MD5加密数据)
 * 
 * @author 延晓磊
 *
 * @since 2018年1月22日
 */
public class RemoteParam implements Serializable{
 
	private static final long serialVersionUID = 1L;
	
	//远程项目的标识：用于识别来源、获取来源对应的私钥/公钥
	private String appId;
	//参数数据：数据JSON（源数据）；加密数据(RSA+AES+MD5+源数据JSON)
	private String data;
	
	private RemoteParam() {
		super();
	}
	
	/**
	 * 构造远程参数 - 公开数据
	 * 
	 * @param appId		
	 * @param data		参数
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public static RemoteParam build(String appId, Object data) {
		RemoteParam param = new RemoteParam();
		param.setAppId(appId);
		param.setData(JsonUtil.toStr(data));
		return param;
	}

	/**
	 * 构造远程参数 - 公钥加密数据
	 * 
	 * @param appId		
	 * @param pubKey	公钥
	 * @param data		参数
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public static RemoteParam buildByPub(String appId, String pubKey, Object data) {
		return build(appId, RSAUtil.sendDataByPub(JsonUtil.toStr(data), pubKey));
	}
	
	/**
	 * 构造远程参数 - 私钥加密数据
	 * 
	 * @param appId		
	 * @param priKey	私钥
	 * @param data		参数
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public static RemoteParam buildByPri(String appId, String priKey, Object data) {
		return build(appId, RSAUtil.sendDataByPri(JsonUtil.toStr(data), priKey));
	}
	
	/**
	 * 获取参数数据 - 私钥解密数据
	 * 
	 * @param data		公钥加密数据：RemoteParam.data
	 * @param priKey	私钥
	 * @return 源数据JSON
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public static String getByPri(String data, String priKey){
		return RSAUtil.readDataByPri(data, priKey);
	}
	
	/**
	 * 获取参数数据 - 公钥解密数据
	 * 
	 * @param data		私钥加密数据：RemoteParam.data
	 * @param pubKey	公钥
	 * @return 源数据JSON
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public static String getByPub(String data, String pubKey){
		return RSAUtil.readDataByPub(data, pubKey);
	}
	
	/**
	 * 远程项目的appId
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public String getAppId() {
		return appId;
	}
	/**
	 * 远程项目的appId
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public void setAppId(String appId) {
		this.appId = appId;
	}
	/**
	 * 参数数据
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public String getData() {
		return data;
	}
	/**
	 * 参数数据
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年1月22日
	 */
	public void setData(String data) {
		this.data = data;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		RemoteParam that = (RemoteParam) o;
		return Objects.equals(appId, that.appId) &&
				Objects.equals(data, that.data);
	}

	@Override
	public int hashCode() {
		return Objects.hash(appId, data);
	}
}
